In [1]:
from IPython.display import Image
Image(url='http://1.bp.blogspot.com/-ME24ePzpzIM/UQLWTwurfXI/AAAAAAAAANw/W3EETIroA80/s1600/drop_shadows_background.png',
width=1000, height=1000)
Out[1]:
In [1]:
import numpy
from sklearn.svm import SVC
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
Creamos nuestro dataset y sus respectivas etiquetas para el entrenamiento
In [2]:
xs = np.array([[np.random.randint(i-10, i), np.random.randint(i-10, i)] for i in [10, 20] for _ in range(100)])
y = [i for i in [1, 2] for _ in range(100)]
print xs.shape, y
Entrenamos ...
In [3]:
sv = SVC(kernel='linear') #kernel='rbf'
In [4]:
sv.fit(xs, y)
Out[4]:
Y consultamos la ubicación de un nuevo individuo ..
In [5]:
sv.predict([17,5])
Out[5]:
Obtenemos la función de decisión para observar la clasificación obtenida
In [6]:
XX_svm, YY_svm = np.mgrid[0:20:1000j, 0:20:1000j]
Z_svm = sv.decision_function(np.c_[XX_svm.ravel(), YY_svm.ravel()])
Z_svm = Z_svm.reshape(XX_svm.shape)
print Z_svm
In [7]:
plt.plot(xs[:100, 0],xs[:100, 1],'ro')
plt.plot(xs[100:, 0],xs[100:, 1],'go')
plt.contour(XX_svm, YY_svm, Z_svm, colors=['k', 'k', 'k'], linestyles=['--', '-', '--'], levels=[-.5, 0, .5])
plt.pcolormesh(XX_svm, YY_svm, Z_svm > 0, cmap=plt.cm.Paired)
plt.xlim(0, 20)
plt.ylim(0, 20)
Out[7]:
Ahora cambie el tipo de kernel de la SVM y vuelva a graficar, que cambio?
In [8]:
from sklearn.neighbors import KNeighborsClassifier, NearestCentroid
In [9]:
kn = KNeighborsClassifier(n_neighbors=6, weights='uniform')
In [10]:
kn.fit(xs, y)
Out[10]:
In [11]:
XX, YY = np.mgrid[0:20:1000j, 0:20:1000j]
Z = kn.predict(np.c_[XX.ravel(), YY.ravel()])
Z = Z.reshape(XX.shape)
In [12]:
plt.plot(xs[:100, 0],xs[:100, 1],'ro')
plt.plot(xs[100:, 0],xs[100:, 1],'go')
plt.pcolormesh(XX, YY, Z, cmap=plt.cm.Paired)
plt.xlim(0, 20)
plt.ylim(0, 20)
Out[12]:
In [13]:
from sklearn.cluster import KMeans, MeanShift, estimate_bandwidth
from sklearn.datasets.samples_generator import make_blobs
In [14]:
km = KMeans(n_clusters=10, n_jobs=2) # Cuantas clases queremos? cambiar n_clusters
In [15]:
km.fit(xs, y)
Out[15]:
In [16]:
XX_km, YY_km = np.mgrid[0:20:1000j, 0:20:1000j]
Z_km = km.predict(np.c_[XX_km.ravel(), YY_km.ravel()])
Z_km = Z_km.reshape(XX_km.shape)
print Z_km
In [17]:
plt.plot(xs[:100, 0],xs[:100, 1],'ro')
plt.plot(xs[100:, 0],xs[100:, 1],'go')
plt.pcolormesh(XX_km, YY_km, Z_km, cmap=plt.cm.Paired)
plt.xlim(0, 20)
plt.ylim(0, 20)
Out[17]:
In [18]:
xs_circle, _ = make_blobs(n_samples=1000, centers=[[3,3], [2,2], [1,1]], cluster_std=0.4)
In [19]:
bandwidth = estimate_bandwidth(xs_circle, quantile=0.2, n_samples=1000)
ms = MeanShift(bandwidth=bandwidth, bin_seeding=True)
In [20]:
ms.fit(xs_circle)
Out[20]:
In [21]:
cluster_centers = ms.cluster_centers_
labels = ms.labels_
print labels.shape
print cluster_centers
In [22]:
colors = ['ro', 'go', 'yo']
map(lambda p: plt.plot(p[0][0], p[0][1], colors[p[1]]), zip(xs_circle, labels))
map(lambda c: plt.plot(c[0], c[1], 'bo', markeredgecolor='k', markersize=14), cluster_centers)
print